/*
 * @Author: sympsel sympsel@outlook.com
 * @Date: 2025-07-16 11:50:13
 * @LastEditors: sympsel sympsel@outlook.com
 * @LastEditTime: 2025-07-16 16:35:59
 * @FilePath: \work25_7_16\src\DoublyLinkedList.h
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

#define MALLOC(_type_, _count_) (_type_*)malloc(sizeof(_type_) * _count_)

// 带头+双向+循环链表增删查改实现
typedef int DataType;
typedef struct ListNode
{
	DataType _data;
	struct ListNode* _next;
	struct ListNode* _prev;
}ListNode;

ListNode* ListCreate();

ListNode* NodeCreate(DataType data);

ListNode* NodeWithPointerCreate(ListNode* prev, DataType data, ListNode* next);



// 双向链表销毁
void ListDestroy(ListNode* pHead);
// 双向链表打印
void ListPrint(ListNode* pHead);
// 双向链表尾插
void ListPushBack(ListNode* pHead, DataType data);
// 双向链表尾删
void ListPopBack(ListNode* pHead);
// 双向链表头插
void ListPushFront(ListNode* pHead, DataType data);
// 双向链表头删
void ListPopFront(ListNode* pHead);
// 双向链表查找
ListNode* ListFind(ListNode* pHead, DataType data);
// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, DataType data);
// 双向链表删除pos位置的节点
void ListErase(ListNode* pos);

bool IsEmpty(ListNode* pHead);